package classpath

import "os"
import "strings"

const pathListSeparator = string(os.PathListSeparator)

/*
利用组合模式来实现各种类路径
此接口表示一个类路径项,具有读取class文件的功能，提供class的名字，在自己所代表的路径下读取class文件
*/
type Entry interface {
	/*
		寻找和加载类文件
		classname代表class文件的相对路径，路径之间用/分隔
		要读取java.lang.Object,传递的参数为java/lang/Object.class(后缀.class不能省略)
		返回类型：
			第一个为读取到的class文件字节数组
			第二个为class文件所在的Entry
			第三个是错误信息
	*/

	readClass(className string) ([]byte, Entry, error)
	String() string //相当于toString方法
}

/*
	依据参数创建不同类型的Entry实例
*/
func newEntry(path string) Entry {
	if strings.Contains(path, pathListSeparator) {
		return newCompositeEntry(path) //比如输入的类路径xxx\classes;yyy\1.jar;这称之为复合Entry 分号是windows下的路径分隔符，linux下用冒号
	}
	if strings.HasSuffix(path, "*") {
		return newWildcardEntry(path)
	}
	if strings.HasSuffix(path, ".jar") || strings.HasSuffix(path, ".JAR") || strings.HasSuffix(path, ".zip") || strings.HasSuffix(path, ".ZIP") {
		return newZipEntry(path)
	}
	return newDirEntry(path)
}
